package com.aiwiown.face.domain;

import com.aiwiown.face.ApiObject;
import com.aiwiown.face.domain.params.ApiParamType;
import com.aiwiown.face.domain.params.ComparisonType;
import com.aiwiown.face.domain.params.MultiOrientedDetection;
import com.aiwiown.face.domain.params.ScreenReplay;
import com.aiwiown.face.internal.mapping.ApiField;

import java.io.File;

/**
 * <pre>
 * </pre>
 * PcTokenModel
 * Date: 2020/5/11 0011
 * Time: 15:57
 *
 * @author tang.xiaosheng@qq.com
 */
public class PcTokenModel extends ApiObject {
    private static final long serialVersionUID = 2630772183299944795L;

    /**
     * 确定本次比对为“KYC验证”或“人脸比对”。取值只为“1”或“0”，取其他值返回错误码400（BAD_ARGUMENTS）。
     * “1”表示KYC验证，表示最终的用户自拍照片将于参考照片比对。
     * “0”表示人脸比对，FaceID将使用用户自己提供的照片（参数image_ref[x]）作为比对人脸照。
     * <p>
     * 请注意：
     * <p>
     * 本参数影响验证流程中是否存在身份证拍摄环节：如果为“1”，则可选择包含身份证拍摄；如果为“0”，验证流程中将没有身份证拍摄。
     * 本参数取什么值将决定下面“二选一”参数组使用哪一组参数。
     */
    @ApiField(value = "comparison_type", paramType = ApiParamType.ENUM)
    private ComparisonType comparisonType;

    /**
     * idcard_name， 需要KYC验证对象的姓名，使用UTF-8编码；
     * <p>
     * idcard_mode = 0 时，这两个参数必须传；在其他情况下可以不传，即使传递了也不会使用。
     */
    @ApiField("idcard_name")
    private String idCardName;

    /**
     * idcard_number， 需要KYC验证对象的身份证号，也就是一个18位长度的字符串。
     */
    @ApiField("idcard_number")
    private String idCardNumber;

    /**
     * 多张由您自己提供的参照人脸照片。x表示此参数可重复多次，其中1 <= x <= 2，即表示可以传最多二张参照人脸照片（参数分别为image_ref1, image_ref2）。
     * <p>
     * 如果在image_ref1、image_ref2中的任一张图片里没有找到人脸，将返回错误码400（NO_FACE_FOUND)；
     * <p>
     * 如果这些图片中任一张中有多张脸，将返回错误码400（MULTIPLE_FACES）。
     */
    @ApiField(value = "image_ref1", paramType = ApiParamType.FILE)
    private File imageRef1;

    /**
     * 多张由您自己提供的参照人脸照片。x表示此参数可重复多次，其中1 <= x <= 2，即表示可以传最多二张参照人脸照片（参数分别为image_ref1, image_ref2）。
     * <p>
     * 如果在image_ref1、image_ref2中的任一张图片里没有找到人脸，将返回错误码400（NO_FACE_FOUND)；
     * <p>
     * 如果这些图片中任一张中有多张脸，将返回错误码400（MULTIPLE_FACES）。
     */
    @ApiField(value = "image_ref2", paramType = ApiParamType.FILE)
    private File imageRef2;

    /**
     * 多张由您自己提供的参照人脸照片。x表示此参数可重复多次，其中1 <= x <= 2，即表示可以传最多二张参照人脸照片（参数分别为image_ref1, image_ref2）。
     * <p>
     * 如果在image_ref1、image_ref2中的任一张图片里没有找到人脸，将返回错误码400（NO_FACE_FOUND)；
     * <p>
     * 如果这些图片中任一张中有多张脸，将返回错误码400（MULTIPLE_FACES）。
     */
    @ApiField(value = "image_ref3", paramType = ApiParamType.FILE)
    private File imageRef3;

    /**
     * 如果用户不使用参考数据进行比对，则上传此字段，用于标志本次识别对应的用户的唯一ID，要求不长于128字节。建议您对来自同一用户的比对请求使用同样的ID，这非常有利于您反查验证结果以及获得更好的监控报表体验
     */
    @ApiField("uuid")
    private String uuid;

    /**
     * 用户完成或取消验证后网页跳转的目标URL。（回调方法为Post）
     */
    @ApiField("return_url")
    private String returnUrl;

    /**
     * 用户完成验证、取消验证、或验证超时后，由FaceID服务器请求客户服务器的URL。（推荐为HTTPS页面，如果为HTTP则用户需要通过签名自行校验数据可信性，回调方法为Post）
     * <p>
     * 注：出于安全性考虑，FaceID服务对服务器端回调端口有白名单要求，支持的端口有：443，5000，16003，8883，8028
     */
    @ApiField("notify_url")
    private String notifyUrl;

    /**
     * “默认为空”。客户业务流水号，建议设置为您的业务相关的流水串号并且唯一，会在return时原封不动的返回给您的服务器，以帮助您确认对应业务的归属。此字段不超过128字节。
     */
    @ApiField("biz_no")
    private String bizNo;

    /**
     * 在调用notify_url和return_url时会返回的额外数据，用户可以用此接口来传递一些额外信息，以帮助您调试和信息传递。此字段不超过4096字节。
     */
    @ApiField("biz_extra_data")
    private String bizExtraData;

    /**
     * 在控制台配置的对应使用场景的scene_id，如果不传此参数，则选择在控制台中设置的默认scene。
     */
    @ApiField("scene_id")
    private String sceneId;

    /**
     * 表示是否开启屏幕翻拍检测。
     * <p>
     * 0：默认值，不开启屏幕翻拍的检测；
     * 1：开启屏幕翻拍检测(若检测屏幕翻拍，返回值将增加屏幕翻拍的结果返回)
     * 注：由于PC端的某些摄像头的驱动，自带增加摄像头视频特效等功能。开启屏幕翻拍检测之后，有可能导致误检增加。
     */
    @ApiField(value = "screen_replay", paramType = ApiParamType.ENUM)
    private ScreenReplay screenReplay;

    /**
     * 对image_ref[x]参数启用图片旋转检测功能。当image_ref[x]参数中传入的图片未检测到人脸时，是否对图片尝试旋转90度、180度、270度后再检测人脸。本参数取值只能是 “1” 或 "0" （缺省值为“0”）:
     * <p>
     * “1”：启用旋转检测（启用旋转检测后，会增加API的调用时间）
     * “0”：不启用旋转检测
     * <p>
     * 其他值：返回错误码400（BAD_ARGUMENTS）
     * <p>
     * 注意：设置此参数为1可能会轻微增加误检人脸的概率，如果您明确您的业务场景里不存在非正向的人脸图片、或概率极低，建议勿设置此参数。
     */
    @ApiField(value = "multi_oriented_detection", paramType = ApiParamType.ENUM)
    private MultiOrientedDetection multiOrientedDetection;

    public ComparisonType getComparisonType() {
        return comparisonType;
    }

    public void setComparisonType(ComparisonType comparisonType) {
        this.comparisonType = comparisonType;
    }

    public String getIdCardName() {
        return idCardName;
    }

    public void setIdCardName(String idCardName) {
        this.idCardName = idCardName;
    }

    public String getIdCardNumber() {
        return idCardNumber;
    }

    public void setIdCardNumber(String idCardNumber) {
        this.idCardNumber = idCardNumber;
    }

    public File getImageRef1() {
        return imageRef1;
    }

    public void setImageRef1(File imageRef1) {
        this.imageRef1 = imageRef1;
    }

    public File getImageRef2() {
        return imageRef2;
    }

    public void setImageRef2(File imageRef2) {
        this.imageRef2 = imageRef2;
    }

    public File getImageRef3() {
        return imageRef3;
    }

    public void setImageRef3(File imageRef3) {
        this.imageRef3 = imageRef3;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getReturnUrl() {
        return returnUrl;
    }

    public void setReturnUrl(String returnUrl) {
        this.returnUrl = returnUrl;
    }

    public String getNotifyUrl() {
        return notifyUrl;
    }

    public void setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
    }

    public String getBizNo() {
        return bizNo;
    }

    public void setBizNo(String bizNo) {
        this.bizNo = bizNo;
    }

    public String getBizExtraData() {
        return bizExtraData;
    }

    public void setBizExtraData(String bizExtraData) {
        this.bizExtraData = bizExtraData;
    }

    public String getSceneId() {
        return sceneId;
    }

    public void setSceneId(String sceneId) {
        this.sceneId = sceneId;
    }

    public ScreenReplay getScreenReplay() {
        return screenReplay;
    }

    public void setScreenReplay(ScreenReplay screenReplay) {
        this.screenReplay = screenReplay;
    }

    public MultiOrientedDetection getMultiOrientedDetection() {
        return multiOrientedDetection;
    }

    public void setMultiOrientedDetection(MultiOrientedDetection multiOrientedDetection) {
        this.multiOrientedDetection = multiOrientedDetection;
    }
}
